<?php
/**
 * Controller_Base
 *
 * Класс Controller_Base отвечает за базовую работу всех контроллеров
 *
 * @author Дмитрий Кузьма <kouzma.d@gmail.com>
 * @version 1.0
 */
abstract class Controller_Base {

	// Стандартные атрибуты. Используются во все проектах
  protected $showAnalytics = true; // Флаг, выводить или нет код гугл-аналитикс
  protected $isPrint = false; // Флаг, является ли данная страница страницей для печати
  protected $title = ''; // Мета-тайтл страницы
	protected $pageHead = ''; // Главный заголовок страницы
	protected $bodyAttrs = ''; // атрибуты тега body
	protected $keywords = null; // мета-ключевые слова
	protected $description = null; // мета-описание
	protected $pageDescription = null; // Описание страницы - стандартно выводится под заголовком страницы
	protected $pageSeo = null; // Описание страницы для СЕО
	protected $arrCss = array(
	);
	
	protected $arrJs = array(
	); // список подключаемых js-файлов
	
	protected $arrRequest = array(); // Массив, содержащий информацию о запросе к странице (элементы массива  - то что между слешами в URL)
	protected $jsReady; // JS-код, который будет автоматически вызван при загрузке страницы
	protected $arrAdditional = array(); // в этом массив можно вносить строки любых мета-тегов. Он будет выведен внутри элемента haed
	protected $showUserMessagesInStandardPlace = false; // Флаг, определяющий выводить ли системные сообщения о выполнении действий пользователю в стандартном месте
	protected $arrUserVars = array(); // Хранилище для пользовательских переменных. Например, для флагов свернуто/развернуто
  protected $showLeftColumn = false; // Флаг, указывающий, нужно ли выводить левую колонку
  protected $showRightColumn = false; // Флаг, указывающий, нужно ли выводить левую колонку
  // Атрибуты, связанные с постраничным выводом
  protected $pageLimit = 20;            // Кол-во элементов на страницу
  protected $editLimit = 10;						// Кол-во элементов при редаактировании
  protected $id = 0;										// Текущий элемент
  protected $pageNum = 1;               // Текущая страница
  protected $elementsInListAmount = 0;  // Количество элементов в списке для постраничного вывода
  protected $pageUrlsInGet = true;      // Номер страницы передавать в GET
  protected $isPageInUrl = false;       // Номер страницы уже фигурирует в URL. Требуется только тогда, когда $pageUrlsInGet == false
  protected $editUrl = null;            // Ссылка на редактирование. Если ее задать в заголовке автоматически появится "ред."
  protected $addUrl = null;            // Ссылка на добавление. Если ее задать в заголовке автоматически появится "Добавить"
  protected $mainActionHtml = null;     // HTML код основной ссылки - будут вставляться в div с float right в основном заголовке
  public	$error = 0;
  protected $showLeftMenu = true; // выводить левое меню или нет
  protected $showCrumbsInStandardPlace = true; // Флаг, определяющий, выводить ли хлебные крошки в стандартном месте
  protected $ifLastCrumbIsLink = false; // Флаг, определяющий, выводить ли хлебные крошки в стандартном месте
  protected $arrCrumbs = array();
  protected $language = 'rus';
	public 		$data = array(); // Массив с данными которые могу использовать любые методы контроллера
	public 		$showPrebasement = false; 
	public 		$version; 
	protected $canonical = null; // Канонический адрес страницы
	protected $callBackFunction;
	protected $beforeAll;
	protected $cssJsDescription = 'css_js.php';
	protected $transaction = null; // Код транзакции для аналитики
	protected $bodyControllerName = null; // Название текущего контроллера. Подставлятся в body class="_..." Используется клиентской частью для определения, где мы находимся.
	protected $bodyActionName = null; // Название текущего действия (action). Подставлятся в body class="__..." Используется клиентской частью для определения, где мы находимс.
	/** 
	 * содержит описание для поисковиков
	 * @var objMicroData_Base
	 */
	protected $objMicroData = null; 
  
	/**
	 * Конструктор контроллера
	 *
	 * @param array $arrRequest - массив, содержащий информацию о запросе к странице (элементы массива  - то что между слешами в URL)
	 */
	public function __construct(&$arrRequest) {
	  Service_Debug::setDebug();
	  	$this->objMicroData = new Microdata_Base();
		$this->arrRequest = &$arrRequest;
		$this->pageNum = isset($_GET['p']) ? abs(intval($_GET['p'])) : 1; //номер страницы в листалке
	}

	protected function compressCssJs() {
		$cssJsConfig = array(
			'css' => array(),
			'js' => array()	
		);
		
		require $this->cssJsDescription;
		
		$saveHash = function(array $uris) {
			if(empty($uris)) return;
			
			$content = current($uris);
			$fname = key($uris);
			if(file_exists('.' . $content[1])) return;
			file_put_contents(ABSPATH . 'temp/sm_' . $fname, $content[0]);
		};
		
		$cssJsConfig['css'] = array_unique($cssJsConfig['css']);
		
		$merger = new \HTTP_StaticMerger(SECURITY_KEY);

		//css
		foreach ($cssJsConfig['css'] as &$css) {
			if(!preg_match('#^((\w+:)?//)#s', $css)) $css = W_CSS . $css;
		}
		$uris1 = array();
		//always compress for IE
		$ie = isset($_SERVER['HTTP_USER_AGENT']) ? !!preg_match('/msie/i', $_SERVER['HTTP_USER_AGENT']) : 0;
		echo "\n" . $merger->getHtml("/static.php/", $cssJsConfig['css'], $ie ? false : NO_JS_CSS_MERGE, '', $uris1) . "\n";
		$saveHash($uris1);
		
		//scripts
		if(!is_array(current($cssJsConfig['js']))) $cssJsConfig['js'] = array($cssJsConfig['js']);
		
		//include firebug lite for safari on non-production servers
		if(stripos(SITE_URL, 'hotels.ru')===false && preg_match('/safari/i', User_Session::getUserAgent()) && !preg_match('/chrome/i', User_Session::getUserAgent())) {
			//array_unshift($cssJsConfig['js'][0], '//getfirebug.com/firebug-lite.js#startOpened=true');
		}
		
		foreach ($cssJsConfig['js'] as &$jsgroup) {
			$jsgroup = array_unique($jsgroup);
			foreach ($jsgroup as &$js) {
				if(!preg_match('#^((\w+:)?//)#s', $js)) $js = W_JS . $js;
			}
			$uris2 = array();
			echo "\n" . $merger->getHtml("/static.php/", $jsgroup, NO_JS_CSS_MERGE, '', $uris2) . "\n";
			$saveHash($uris2);
		}
		//templates
		$tpls = Service_Function::globr(ABSPATH . 'content/js/templates' , "*.tmpl");

		$maxTimestamp = 0;
		foreach($tpls as $tpl) $maxTimestamp = max($maxTimestamp, filemtime($tpl));
		
		echo "<script>App_templatesTimestamp = " . $maxTimestamp . ";</script>\n";
	}

	/**
	 * Выбираем действие в зависимости от URL в $this->arrRequest (Переопределяется в наследуемых классах)
	 *
	 */
	public function action() {
		throw new Exception_SiteError('', 404);
	}
	

	
	/**
	 * Метод выводит метаданные
	 *
	 */
	public function showMetas() {
	  Service_Debug::setDebug();
	  
	  if (empty($this->bodyControllerName)) $this->bodyControllerName = strtolower(str_replace('Controller_', '', get_class($this)));
	  $language = Service_Translate::getLang();
		?><?php if(!isset($_SERVER['HTTP_USER_AGENT']) || strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE 6.') === FALSE) echo '<!DOCTYPE html>' ?>
<!--[if lt IE 7 ]> <html lang="<?php echo $language; ?>" class="ie ie6"> <![endif]-->
<!--[if IE 7 ]> <html lang="<?php echo $language; ?>" class="ie ie7"> <![endif]-->
<!--[if IE 8 ]> <html lang="<?php echo $language; ?>" class="ie ie8"> <![endif]-->
<!--[if IE 9 ]> <html lang="<?php echo $language; ?>" class="ie ie9"> <![endif]-->
<!--[if (gt IE 9)|!(IE)]><!--> <html lang="<?php echo $language; ?>"> <!--<![endif]-->
<head>
<title><?php echo $this->title;?></title>


<meta charset="utf-8" />
<meta name="author" content="Kouzma" />
<link rel="shortcut icon" href="<?php echo W_IMAGES;?>favicon.ico"
	type="image/x-icon" />
  	<?php 
  	
  	//objMicroData for VK & Facebook
	/*if((string)$this->objMicroData) {
		echo '<link rel="image_src" href="' . $this->objMicroData->image . '" />';
		//escape it!!
		echo '<meta property="og:description" content="' . $this->objMicroData->description . '"/>';
	}
	*/
	  if (isset($this->keywords))	echo '<meta name="keywords" content="' . $this->keywords . '" />';
	  if (isset($this->description)) echo '<meta name="description" content="' . $this->description . '" />';
	  if ($this->canonical && $this->canonical != preg_replace("|" . W_ABSPATH . "|", W_FULLPATH, $_SERVER['REQUEST_URI'], 1)) echo '<link rel="canonical" href="' . $this->canonical . '" />';

	  foreach ($this->arrAdditional as $additional) echo $additional;
	  	
	  $this->compressCssJs();

	  foreach ($this->arrCss as $cssFile)	echo '<link rel="stylesheet" type="text/css" href="' . W_CSS . $cssFile . '" />';
  	
	  foreach ($this->arrJs as $jsFile) echo '<script type="text/javascript" src="' . W_JS . $jsFile . '"></script>' . "\n";		
		
		echo '<script type="text/javascript">';
		
		if(!NO_JS_CSS_MERGE) ob_start();
		
		if (isset($this->jsReady)) {			
			echo '$().ready(function() {';
				echo $this->jsReady;
			echo '});';
		}
		
		echo 'var currency = "' . Service_Exchange::getCurrency() . '";';
		
		if(!NO_JS_CSS_MERGE) {
			$packer = new JavaScriptPacker(ob_get_clean(), 0);
			echo $packer->pack();
		}
		
		echo '</script>';

		?>		
		</head>
<body <?php echo $this->bodyAttrs;?> class="_<?php echo $this->bodyControllerName . (!empty($this->bodyActionName) ? ' __' . $this->bodyActionName : null);?>">
	<div id="full">
		<?php if (!empty($this->beforeAll)) echo $this->beforeAll;?>
		<div id="all">
			<div id="allIn" <?php echo $this->objMicroData;?>>
		<?php
			echo $this->objMicroData->meta('description');
			echo $this->objMicroData->meta('image');
			echo $this->objMicroData->meta('telephone');
	}


	
  /**
   * Метод добавляет css файл к общему массиву
   *
   * @param string $cssFileName
   */
	public function addCss($cssFileName) {
  	$this->arrCss[] = $cssFileName;
  }
  /**
   * Метод добавляет js файл к общему массиву
   *
   * @param string $jsFileName
   */
	public function addJs($jsFileName) {
  	$this->arrJs[] = $jsFileName;
  }

  /**
   * Метод добавляет js файл в начало общего массива
   *
   * @param string $jsFileName
   */
	public function addJsToBegin($jsFileName) {
  	$this->arrJs = array_merge(array($jsFileName), $this->arrJs);
  }
  /**
   * Метод добавляет очередную хлебную крошки к общему массиву
   *
   * @param string $arrCrumb
   */
	public function addCrumb($name, $url = null, $noLinkIfLast = false) {
  	$arrCrumb = array();
  	$arrCrumb['name'] = $name;
  	$arrCrumb['url'] = $url;
  	$arrCrumb['no_link_if_last'] = $noLinkIfLast;
	  $this->arrCrumbs[] = $arrCrumb;
  }
  /**
   * Метод устанавливает хлебные крошки
   *
   * @param string $arrCrumbs
   */
	public function setCrumbs($arrCrumbs) {
  	$this->arrCrumbs = $arrCrumbs;
  }
  /**
   * Метод добавляет доплнительный код в метатеги
   *
   * @param string $additional
   */
	public function addAdditional($additional) {
  	$this->arrAdditional[] = $additional;
  }
  /**
   * Метод задает js код, который будет выполняться при загрузке страницы
   *
   * @param string $jsReadyText
   */
	public function setJsReady($jsReadyText) {
  	$this->jsReady = $jsReadyText;
  }

  /**
   * Метод добавляет js код, который будет выполняться при загрузке страницы
   *
   * @param string $jsReadyText
   */
  public function addJsReady($jsReadyText) {
    if (!isset($this->jsReady)) $this->jsReady = $jsReadyText;
    else $this->jsReady .= $jsReadyText;
  }

  /**
   * Метод закрывает html-код
   *
   */
	public function showClose() {
	  Service_Debug::setDebug();
	  if ($this->showAnalytics  && SHOW_ANALYTICS) {
			$this->showAnalytics();
    }
	  /*if (User_User::getId() == 1) {
    	echo '<!-- RedHelper -->
			<script id="rhlpscrtg" type="text/javascript" charset="utf-8" async="async"
				src="http://web.redhelper.ru/service/main.js?c=slamer"></script>
			<!--/Redhelper -->';	
    }*/
    if (DEBUG) {
    	$objDebug = Service_Debug::instance();
			$objDebug->echoDebug();
    }
    echo '</body>';
		echo '</html>';
	}


	/**
	 * Выводит шапку
	 *
	 */
	public function showHeader() {
	  Service_Debug::setDebug();
		$this->showUserMessages();
	 
  	$this->showMetas();    // вывод метатегов
		$this->showTop();      // вывод верхней части

		
		// Вывод хлебных крошек
		if ($this->showCrumbsInStandardPlace) {
			$this->showCrumbs();
		}
		
		// вывод основного заголовка
		if ($this->pageHead != '') {
			$this->showH1($this->pageHead);
		}
		
		if (!empty($this->callBackFunction)) call_user_func(array($this, $this->callBackFunction));
		
		// Вывод боковых столбцов и
		if ($this->showLeftColumn) $this->showLeft();
		if ($this->showRightColumn) $this->showRight();
		
		// Вывод основного дива в зависимости от наличия боковых столбцов
		if ($this->showLeftColumn && $this->showRightColumn) echo '<div id="main">';
		elseif (!$this->showLeftColumn && $this->showRightColumn) echo '<div id="mainWithLeft">';
		elseif ($this->showLeftColumn && !$this->showRightColumn) echo '<div id="mainWithRight">';
		else echo '<div id="mainFullWidth">';

		// вывод сообщения об ошибке
		$this->showErrorMessages();

		if(!empty($this->pageSeo)) echo '<div class="text-description">' . $this->pageSeo . '</div>';

  }
  
  protected function showUserMessages() {
//   	if (!$this->showUserMessagesInStandardPlace) {
//   		if (User_Flash::_get('successMessage')) $messageClass = 'successMessage';
//   		if (User_Flash::_get('errorMessage')) $messageClass = 'errorMessage';
//   		if (!empty($messageClass)) {
//   			$this->addJsReady("
//   					$('#" . $messageClass . "').dialog({
//   					width: 600,
//   					height: 450,
//   					position: 'center',
//   					modal: true
//   		});");
//   		}
//   	}
  }
  
  protected function showErrorMessages() {
  	if ($this->showUserMessagesInStandardPlace) {
  		if (User_Flash::_get('successMessage')) View_User::showUserMessage(User_Flash::_get('successMessage'), 1);
  		if (User_Flash::_get('errorMessage')) View_User::showUserMessage(User_Flash::_get('errorMessage'), -1);
  	}
  	else {
  		if (User_Flash::_get('successMessage')) {
  			echo '<div id="successMessage" style="display:none;">' . User_Flash::_get('successMessage') . '</div>';
  		}
  		if (User_Flash::_get('errorMessage')) {
  			echo '<div id="errorMessage" style="display:none;">' . User_Flash::_get('errorMessage') . '</div>';
  		}
  	}
  }

  /**
   * Метод выводит стандартный заголовок
   *
   * @param string $pageHead
   * @param string $editUrl
   */
  public function showH1($pageHead = null, $editUrl = null, $addUrl = null) {
	  Service_Debug::setDebug();
	  if(empty($pageHead)) $pageHead = $this->pageHead;
	  
	  //convert using objMicroData
	  if((string)($this->objMicroData)) {
		$pageHead = str_ireplace($this->objMicroData->name, '<span' . $this->objMicroData->prop('name') . '>' . $this->objMicroData->name . '</span>', $pageHead);
	  }
	  
	  if(empty($editUrl)) $editUrl = $this->editUrl;
	  if(empty($addUrl)) $addUrl = $this->addUrl;
	  echo '<h1>';
	  	echo $pageHead;
	    if (!empty($editUrl)) echo ' (<a href="' . $editUrl . '">' . Service_Translate::getText('Редактировать') . '</a>)';
	    elseif(!empty($addUrl)) echo ' (<a href="' . $addUrl . '">' . Service_Translate::getText('Добавить') . '</a>)';
	  echo '</h1>';
	  if(!empty($this->pageDescription)) echo '<h3 class="col-2">' . $this->pageDescription . '</h3>';	  
  }
  
    /**
   * Метод выводит хлебные крошки
   *
   */
  public function showCrumbs() {
    Service_Debug::setDebug();
    $objViewBlock = new View_Block();
    $objViewBlock->showCrumbs($this->arrCrumbs, $this->ifLastCrumbIsLink);
  }

  /**
   * Выводит подвал
   *
   */
  public function showFooter() {
  	Service_Debug::setDebug();
  	echo '</div>'; // Закрываем div из header (mainWithLeft/mainWithRight/mainFullWidth)
  	echo '<div class="clear"></div>';
  	echo '</div>';// Закрываем <div id="allIn">
  	echo '</div>'; // Закрываем <div id="all">
  	echo '<div id="footerHeight"></div>';	
  	echo '</div>'; // Закрываем <div id="full">
    $this->showBasement();    
  	$this->showClose();
  }

  /**
   * Выводит верхнюю часть
   *
   */
  public function showTop() {
    Service_Debug::setDebug();
    $objViewBlock = new View_Block();
    $objViewBlock->showTop();
   // $objViewBlock->showMainMenu(array());
  }

  /**
   * Выводит нижнюю часть
   *
   */
  public function showBasement() {
    Service_Debug::setDebug();
    $objViewBlock = new View_Block();
    $objViewBlock->showBasement($this->showPrebasement);
  }
  
  public function showAnalytics() {
  	Service_Debug::setDebug();
?>
<!-- Yandex.Metrika counter --><script type="text/javascript">(function (d, w, c) { (w[c] = w[c] || []).push(function() { try { w.yaCounter17786467 = new Ya.Metrika({id:17786467, enableAll: true, webvisor:true}); } catch(e) { } }); var n = d.getElementsByTagName("script")[0], s = d.createElement("script"), f = function () { n.parentNode.insertBefore(s, n); }; s.type = "text/javascript"; s.async = true; s.src = (d.location.protocol == "https:" ? "https:" : "http:") + "//mc.yandex.ru/metrika/watch.js"; if (w.opera == "[object Opera]") { d.addEventListener("DOMContentLoaded", f); } else { f(); } })(document, window, "yandex_metrika_callbacks");</script><noscript><div><img src="//mc.yandex.ru/watch/17786467" style="position:absolute; left:-9999px;" alt="" /></div></noscript><!-- /Yandex.Metrika counter -->
<script type="text/javascript">

  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-3048988-11']);
  _gaq.push(['_trackPageview']);

  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();
</script>
<?php 
  }

  /**
   * Выводит левую часть
   *
   */
  public function showLeft() {
  	echo '<div id="left">';
      echo 'Левое меню';
  	echo '</div>';
  }


  /**
   * Выводит правую часть
   *
   */
  public function showRight() {
  	Service_Debug::setDebug();
  	$objViewBlock = new View_Block();
  	echo '<div id="right">';
      //$objViewBlock->showSocialButtonsBlock();
      //$objViewBlock->showTopClientBanner();
      $objViewBlock->showGroupBookingBanner();
      //echo '<div class="theSimplestBorder alignCenter">' . Service_Translate::getText('По вопросам рекламы') . '</div>';
  	echo '</div>';
  }

	/**
	 * Метод выводит сообщение об ошибке
	 *
	 */
	public function showError() {
		$objError = new Error();
		$objError->setFields(array('error_name' => 'Site error ' . $this->error, 'error_text' => $_SERVER['REQUEST_URI']));
		$objError->save();
		switch ($this->error) {
			case 404:
				header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");
				$this->pageHead = $this->title = Service_Translate::getText('Такая страница не существует.');
				$objViewBlock = new View_Block();
				$objViewBlock->errorPage('404');
				exit();
				break;
			case 403:
				header($_SERVER["SERVER_PROTOCOL"]." 403 Forbidden");
				$objViewBlock = new View_Block();
				$objViewBlock->errorPage('403');
				exit();
				break;
			case 503:
				header($_SERVER["SERVER_PROTOCOL"]." 503 Service Unavailable");
				$this->pageHead = $this->title = Service_Translate::getText('Сервис временно недоступен.');
				break;
			default:
				$this->pageHead = $this->title = Service_Translate::getText('Произошла неизветная ошибка.');
				break;
		}
		$this->showRightColumn = false;
		$this->showLeftColumn = false;
		$this->showAnalytics = false;
		
    $this->showHeader();
		$this->showFooter();
	}


	/**
	 * Метод проверяет авторизацию пользователя и передает в js функцию
	 *
	 */
	public function addMetasForLogInCheck() {
		$objSession = User_Session::instance();
		$userId = $objSession->getUserId();
		if ($userId) $loggedIn = 1;
		else $loggedIn = 0;
		$this->addJsReady('user.logInCheck({"loggedIn": ' . $loggedIn . '});');
	}

  /**
   * Формирует url без GET параметров
   *
   * @return string
   */
  public function getCurrentUrl() {
    $urlBeforePageNummber = W_ABSPATH;
    //Формируем основной URL (то, что до символа "?")
    if (!empty($this->arrRequest)) {
      foreach ($this->arrRequest as $urlWord) {
        if (!empty($urlWord)) $urlBeforePageNummber .= $urlWord . '/';
      }
    }
    return $urlBeforePageNummber;
  }
  
	/**
	 * Метод выводит блок постраничного листания
	 */
	public function showPages() {
    $urlBeforePageNummber = W_ABSPATH;
    $urlAfterPageNummber = '';
    //Формируем основной URL (то, что до символа "?")
    if (!empty($this->arrRequest)) foreach ($this->arrRequest as $key => $urlWord) {
    	if ($key == 0 && $urlWord == 'hms') {
    		$urlBeforePageNummber = W_HOTEL_ADMIN;
    		continue;
    	}
    	if (!empty($urlWord)) $urlBeforePageNummber .= $urlWord . '/';
    }

    if (!$this->pageUrlsInGet) { //Если номер страницы нужно передавать не через "?", а через /123/
      $urlAfterPageNummber = '/';
      if (!empty($_SERVER['QUERY_STRING'])) {
        $urlAfterPageNummber .= '?' . $_SERVER['QUERY_STRING'];
      }
      if ($this->isPageInUrl) {
        $urlBeforePageNummber = substr($urlBeforePageNummber, 0, strlen($urlBeforePageNummber) - 1);
        $urlBeforePageNummber = substr($urlBeforePageNummber, 0, strrpos($urlBeforePageNummber, '/') + 1);
      }
    }
    else { // Если номер страницы нужно передавать в GET, через "?"
      $urlBeforePageNummber .= '?';
      if (strpos($_SERVER['QUERY_STRING'], 'p=') === 0) { // Если среди GET параметров в самом начале стоит p=
        $urlBeforePageNummber .= 'p=';
        if (strpos($_SERVER['QUERY_STRING'], '&', 2)) $urlAfterPageNummber = substr($_SERVER['QUERY_STRING'], strpos($_SERVER['QUERY_STRING'], '&', 2));
      }
      else { // Если в начале GET параметров не стоит p=
        $pagePosInGet = strpos($_SERVER['QUERY_STRING'], '&p=');
        if ($pagePosInGet === false) { // Если в GET параметрах вообще отсутствует "p="
          $urlBeforePageNummber .= 'p=';
          $urlAfterPageNummber = '&' . $_SERVER['QUERY_STRING'];
        }
        else { // Если в GET параметрах  "p=" стоит в середине или конце
          $urlBeforePageNummber .= substr($_SERVER['QUERY_STRING'], 0, $pagePosInGet + 3);
          if (strpos($_SERVER['QUERY_STRING'], '&', $pagePosInGet + 1)) $urlAfterPageNummber = substr($_SERVER['QUERY_STRING'], strpos($_SERVER['QUERY_STRING'], '&', $pagePosInGet + 1));
        }
      }
    }

    $pagesAmount = ceil($this->elementsInListAmount / $this->pageLimit);
    View_Pager::getPages($urlBeforePageNummber , $pagesAmount, $this->pageNum, '', $urlAfterPageNummber, $this->elementsInListAmount);
	}

  /**
   * Метод устанавливает текущий язык работы сайта
   * 
   * @param string $language - трехбуквенное сокращение языка
   */
  public function setLanguage($language) {
    $this->language = $language;
  }

  /**
   * Метод добавляет js и css файлы для работы редактора WYSIWYG
   *
   */
	public function addWysiwygMetas() {
		
		$this->addJsReady("
				 
				elRTE.prototype.options.panels.web2pyPanel = [
				'bold', 'italic', 'underline', 'forecolor', 'justifyleft', 'justifyright',
				'justifycenter', 'justifyfull', 'formatblock', 'insertorderedlist', 'insertunorderedlist',
				'link', 'image', 'flash'
				];
				elRTE.prototype.options.toolbars.wysiwygAdmin = [
				'save',
				'copypaste',
				'undoredo',
				'elfinder',
				'style',
				'alignment',
				'direction',
				'colors',
				'format',
				'indent',
				'lists',
				'links',
				'elements',
				'media',
				//'tables',
				'fullscreen'
				];
		
				var opts = {
				lang         : 'ru',   // set your language
				styleWithCSS : false,
				height       : 400,
				toolbar      : 'wysiwygAdmin',
				fmOpen : function(callback) {
				$('<div id=\"myelfinder\" />').elfinder({
				url : W_AJAX + 'wysiwyg/connector/',
				lang : 'ru',
				dialog : { width : 900, modal : true, title : 'Files' }, // открываем в диалоговом окне
				closeOnEditorCallback : true, // закрываем после выбора файла
				editorCallback : callback // передаем callback файловому менеджеру
		})
		}
		};
				// create editor
				$('.wysiwygAdmin').elrte(opts);
				");
		
		$this->arrCss[] = 'plugins/elrte.min.css';
		//$this->arrCss[] = 'elfinder.css';
		
		//$this->arrJs[] = 'elrte.min.js';
		//$this->arrJs[] = 'i18n/elrte.ru.js';
		//$this->arrJs[] = 'elfinder.min.js';
		//$this->arrJs[] = 'elfinder_start.js';
		
		$this->arrJs[] = 'plugins/elrte.min.js';
		$this->arrJs[] = 'plugins/elrte.ru.js';
  }
  				
	/**
	 * Добавляет JS для работы календаря
	 * 
	 * @param string $dateArr - Дата заезда в формате 30/12/2012 
	 * @param string $dateDep - Дата выезда в формате 31/12/2012
	 */
	public function addJsReadyForCalendar($dateArr = null, $dateDep = null) {
  	Service_Debug::setDebug();
  	if (!$dateArr || !$dateDep) {   	
  		$dateArr = Service_Escape::requestDataStringRegExp('date_arr', '/^([0-2]\d|3[01])\/(0\d|1[012])\/(\d{4})$/', 'GET');
	  	$dateDep = Service_Escape::requestDataStringRegExp('date_dep', '/^([0-2]\d|3[01])\/(0\d|1[012])\/(\d{4})$/', 'GET');
  	}
	  if (!$dateArr || !$dateDep) { 
	  	$dateArr = Service_Escape::requestDataStringRegExp('date_arr', '/^([0-2]\d|3[01])\/(0\d|1[012])\/(\d{4})$/', 'COOKIE');
		  $dateDep = Service_Escape::requestDataStringRegExp('date_dep', '/^([0-2]\d|3[01])\/(0\d|1[012])\/(\d{4})$/', 'COOKIE');
	  }
	  $oldDateArr = $dateArr;
	  $oldDateDep = $dateDep;
		if (!$dateArr || !$dateDep || Service_Date::changeDateFormat($dateArr, 'd/m/Y') < Service_Date::changeDateFormat(date('d/m/Y'), 'd/m/Y')) {
	  	$dateArr = date('d/m/Y');
	  	$dateDep = date('d/m/Y', time() + Service_Date::$timestampOneDayInterval);
	  }
	  if ($dateArr && $dateDep) {	  
		  $this->addJsReady("
		  	$('#calendarText').rangeCalendar({
		  		imageUrl: '" . W_IMAGES . "icons/cal_w.png',
		  		imageClass: 'calendar-ico',
					rangeBegin: Date.fromString('" . $dateArr . "', true),
					rangeEnd: Date.fromString('" . $dateDep . "', true),
		  			position: {
		  				my: 'left top',
						at: 'left bottom'
		  			},
		  			onShow: function(){
		  				this.attr('title', '').data('ui-tooltip-title', null).trigger('mouseout');
	  				},
		  			onRangeSelectBegin: function(){
		  		  		this.attr('title', arrLang['Дата заезда выбрана.<br />Выберите дату отъезда']).tooltip({
							position: {
								my: 'left center',
								at: 'right+10 center',
								of: this,
								collision: 'flipfit flipfit'
							},
							tooltipClass: 'popupBox',
							items: '.ui-range-calendar[title]'
						});
						this.tooltip('open');
		  			},
					onRangeSelectEnd: function(rangeStart, rangeEnd){
				  		if (rangeEnd.getTime() - rangeStart.getTime() > 30 * 24 * 3600 * 1000) {
			        		alert(arrLang['Диапазон дат должен быть меньше 30 дней']);
		  					return false;
		  				}
		  		
		  				$('.date_arr').val($.datepicker.formatDate('dd/mm/yy', rangeStart));
		  				$('.date_dep').val($.datepicker.formatDate('dd/mm/yy', rangeEnd));
		  				if(this.is(':ui-tooltip')) this.data('ui-tooltip-title', null).tooltip('close');
	  				},
		  			onRangeSelectCancel: function(){
		  				this.data('ui-tooltip-title', null).tooltip('close');
		  			},
				  	onDateFormat: function() {
						return $.datepicker.formatDate('dd', this) + ' ' + this.getMonthName('fullNum');
					}
				});

			");
	  }    	
  }

  /**
   * Устанавливает ошибку в контроллере
   * 
   * @param int $errorCode - Код ошибки
   */
  public function setError($errorCode) {
  	Service_Debug::setDebug();
  	$this->error = $errorCode;
  }
}
?>
